<?php

if (!class_exists('ClearData', false)) {
    /**
     * 类目数据处理
     *
     * @author Akon(番茄红了) <aultoale@gmail.com>
     */
    class ClearData
    {

        /**
         * 删除类目数据
         */
        public static function cat($cid)
        {
            $cat = DB::select()
                ->from('item_cats')
                ->where('cid=?', $cid)
                ->fetchRow();
            if (!$cat) {
                throw new Exception("ID为 “{$cid}” 的类目不存在");
            }

            // 取出商品数据
            $rows = DB::select()
                ->from(array('g' => 'goods'), 'goods_id')
                ->join(array('c' => 'item_cats'), 'g.cid=c.cid', array())
                ->where('c.cat_path LIKE ?', "{$cat['cat_path']}%")
                ->fetchAll();
            foreach ($rows as $row) {
                // 删除商品图片
                DB::delete('goods_images', 'goods_id='.$row['goods_id']);
                // 删除商品属性
                DB::delete('goods_prop_values', 'goods_id='.$row['goods_id']);
                // 删除商品
                DB::delete('goods', 'goods_id='.$row['goods_id']);
            }

            // 取出产品数据
            $rows = DB::select()
                ->from(array('p' => 'products'), 'product_id')
                ->join(array('c' => 'item_cats'), 'p.cid=c.cid', array())
                ->where('c.cat_path LIKE ?', "{$cat['cat_path']}%")
                ->fetchAll();
            foreach ($rows as $row) {
                // 删除产品图片
                DB::delete('product_imgs', 'product_id='.$row['product_id']);
                // 删除产品属性图片
                DB::delete('product_prop_imgs', 'product_id='.$row['product_id']);
                // 删除产品
                DB::delete('products', 'product_id='.$row['product_id']);
            }

            // 取出子类目数据
            $rows = DB::select()
                ->from('item_cats', 'cid')
                ->where('cat_path LIKE ?', "{$cat['cat_path']}%")
                ->fetchAll();
            foreach ($rows as $row) {
                // 删除类目属性值
                DB::delete('item_cat_values', 'cid='.$row['cid']);
                // 删除类目属性
                DB::delete('item_cat_props', 'cid='.$row['cid']);
                // 删除搜索关键词
                DB::delete('item_cat_keywords', 'cid='.$row['cid']);
                // 删除SKU数据
                DB::delete('item_skus', 'cid='.$row['cid']);
                // 删除类目
                DB::delete('item_cats', 'cid='.$row['cid']);
            }

            return $cat;
        }

        // 扫描目录&文件
        public static function scandir($dir)
        {
            return EGP_Io::scan($dir, array('temp', '.svn'));
        }

    }
}

/**
 * 数据清理&删除
 *
 * @author Akon(番茄红了) <aultoale@gmail.com>
 */

$clearMenu = <<<EOF

---------------------------

 1、删除类目数据

 2、清除未使用的属性

 3、清除无效的图片文件

 0、返回

---------------------------

请选择 (0,1,2,3)：
EOF;

do {
    // 显示菜单
    $input = CLI::input($clearMenu);

    // 删除类目数据
    if ($input == 1) {
        while (true) {
            $cid = CLI::input("\n请输入要删除的类目ID：");
            if (is_numeric($cid) && $cid) {
                try {
                    $cat = ClearData::cat($cid);
                    CLI::output("\n类目 “{$cat['name']}($cid)” 的相关数据已经被删除 √\n");
                } catch (Exception $e) {
                    CLI::output("\n错误：".$e->getMessage()." ×\n");
                }
            } else {
                break;
            }
        }

    // 清除未使用的属性
    } elseif ($input == 2) {

        // 属性数据
        $rows = DB::select()
            ->from(
                array('p' => 'item_props'),
                array('*', 'use_total' => DB::expr('(SELECT COUNT(*) FROM item_cat_props WHERE pid=p.pid)'))
            )
            ->having('use_total=0')
            ->fetchAll();
        foreach ($rows as $row) {
            DB::delete('item_props', 'pid='.$row['pid']);
        }

        CLI::output("\n信息：未使用的属性清理完成 √\n");

    // 清除无效的图片文件
    } elseif ($input == 3) {

        echo "\n";

        $basepath = dirname(__FILE__).'/images';
        $rootdirs = ClearData::scandir($basepath);

        foreach ($rootdirs as $rdir) {
            echo "$rdir ";
            $subdirs = ClearData::scandir($basepath.'/'.$rdir);
            foreach ($subdirs as $sdir) {
                $images = ClearData::scandir($basepath.'/'.$rdir.'/'.$sdir);
                foreach ($images as $image) {
                    // 查询product_imgs表
                    $found = (bool) DB::select()
                        ->from('product_imgs', DB::expr('COUNT(0)'))
                        ->where('image_md5=?', $image)
                        ->fetchOne();
                    if ($found) {
                        continue;
                    }
                    // 查询goods_images表
                    $found = (bool) DB::select()
                        ->from('goods_images', DB::expr('COUNT(0)'))
                        ->where('image_md5=?', $image)
                        ->fetchOne();
                    if ($found) {
                        continue;
                    }
                    // 查询product_prop_imgs表
                    $found = (bool) DB::select()
                        ->from('product_prop_imgs', DB::expr('COUNT(0)'))
                        ->where('image_md5=?', $image)
                        ->fetchOne();
                    if ($found) {
                        continue;
                    }
                    @unlink("$basepath/$rdir/$sdir/$image");
                    echo ">";
                }
                @rmdir($basepath.'/'.$rdir.'/'.$sdir);
            }
            @rmdir($basepath.'/'.$rdir);
            echo "\n";
        }

        echo "\n";

        CLI::output("\n信息：图片文件清理完成 √\n");

    // 返回
    } else {
        break;
    }

    CLI::input("\n请按下回车键继续！");

} while (true);

unset($clearMenu);